package 系统资源类

import (
	扩展类 "gitee.com/go_888/extends/extend"
	"gitee.com/go_888/internal-call/gopsutil/cpu"
	"log"
	"time"
)

// X取CPU核心数 返回系统中物理CPU核心的数量以及可能的错误信息
// 返回值是一个整数，表示CPU核心数；和一个错误值，通常情况下应为nil
func X取CPU核心数() int {
	返回, err := cpu.Counts(false)
	if err != nil {
		log.Printf("取CPU核心数失败：%v", err)
	}
	return 返回
}

// X取CPU占用率 返回CPU占用率。
// 参数:
// - 按核心计算: 一个布尔值，决定是否按核心计算CPU占用率。
// - 统计时长_秒: 可选参数，指定在获取CPU占用率延迟计算时长(延时)，默认为1秒。
// 返回值:
// - float64: CPU占用率的百分比，如果获取失败则返回-1。
// - error: 如果获取CPU占用率失败，返回错误原因。
func X取CPU占用率(统计时长_秒 ...int) float64 {
	// 设置默认延时时间为1秒
	延时 := 1
	// 如果提供了延时参数，使用该参数的值
	if len(统计时长_秒) > 0 {
		延时 = 统计时长_秒[0]
	}

	// 使用提供的延时时间获取CPU占用率
	占用率, err := cpu.Percent(time.Second*time.Duration(延时), false)
	if err != nil {
		log.Printf("获取CPU占用率失败：%v", err)
	}
	// 如果获取到CPU占用率且至少有一个核心的数据
	if len(占用率) > 0 {
		// 返回第一个核心的CPU占用率，保留两位小数
		return 扩展类.X四舍五入(float64(占用率[0]), 2)
	}
	// 如果获取失败，返回-1和错误原因
	return -1
}

// X取CPU信息 获取系统的CPU信息详情
// 精简掉返回为空的字段, 更多信息见cpu.Info()
func X取CPU信息() []CPU信息 {
	// 初始化一个空的CPU信息切片
	返回 := []CPU信息{}

	// 调用cpu.Info()获取CPU信息，忽略错误处理
	cpuInfo, err := cpu.Info()
	if err != nil {
		log.Printf("取CPU信息失败：%v", err)
	}
	if len(cpuInfo) > 0 {
		// 遍历cpuInfo，处理每一个CPU的信息
		for _, v := range cpuInfo {
			// 创建一个CPU信息结构体实例，填充从cpu.Info()获取的单个CPU信息
			cpu := CPU信息{
				X制造商ID: v.VendorID,
				X物理ID:  v.PhysicalID,
				X逻辑核心数: v.Cores,
				X型号名称:  v.ModelName,
				X主频MHz: v.Mhz,
			}

			// 将当前CPU的信息添加到返回的切片中
			返回 = append(返回, cpu)
		}
	}

	// 返回处理后的CPU信息切片
	return 返回
}

type CPU信息 struct {
	X制造商ID string  `json:"vendorId"`
	X物理ID  string  `json:"physicalId"`
	X逻辑核心数 int32   `json:"cores"`
	X型号名称  string  `json:"modelName"`
	X主频MHz float64 `json:"mhz"`
}
